package edu.geo.containers.geomdomain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import edu.geo.containers.geom.impl.GeometryFactory;
import edu.geo.containers.geom.impl.Point;

/**
 * 
 * @author alejandro.sanchez
 *
 */
public class Grid implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -8953211348501909878L;

	/**
	 * Representación de un identificador no válido.
	 */
	public static final int DEFAULT_GRID_ID = -1;
	
	/**
	 * Valor por defecto del número de celdas en el eje X de la grilla.
	 */
	public static final int DEFAULT_X = 10;
	
	/**
	 * Valor por defecto del número de celdas en el eje Y de la grilla.
	 */
	public static final int DEFAULT_Y = 10;
	
	/**
	 * Valor por defecto del intervalo entre 2 puntos de la grilla. Por defecto es 1.
	 */
	public static final int DEFAULT_INT_SIZE = 1;
	
	/**
	 * Identificador único de la grilla.
	 */
	private int id;
	
	/**
	 * Dominio geométrico al que se encuentra asociado la grilla.
	 */
	private int geomDomainId;
	
	/**
	 * 
	 */
	private int numPointsX;
	
	/**
	 * 
	 */
	private int numPointsY;
	
	/**
	 * 
	 */
	private Point origin;
	
	/**
	 * 
	 */
	private int intSize;
	
	/**
	 * Constructor por defecto. Usa como origen el punto (0,0) y el tamaño (DEFAULT_X, DEFAULT_Y).
	 */
	public Grid()
	{		
		origin     = GeometryFactory.createPoint(0, 0);
		numPointsX = DEFAULT_X;
		numPointsY = DEFAULT_Y;
		intSize    = DEFAULT_INT_SIZE;
	}
	
	public Grid(Point origin, int tamX, int tamY, int intSize)
	{		
		this.origin = origin;
		this.numPointsX = tamX;
		this.numPointsY = tamY;
		this.intSize = intSize;
	}

	public int getGeomDomainId() {
		return geomDomainId;
	}

	public void setGeomDomainId(int geomDomainId) {
		this.geomDomainId = geomDomainId;
	}

	public int getId() {
		return id;
	}

	public Point getOrigin() {
		return origin;
	}

	public int getNumPointsX() {
		return numPointsX;
	}

	public void setNumPointsX(int numPointsX) {
		this.numPointsX = numPointsX;
	}

	public int getNumPointsY() {
		return numPointsY;
	}

	public void setNumPointsY(int numPointsY) {
		this.numPointsY = numPointsY;
	}

	public int getIntSize() {
		return intSize;
	}

	public void setIntSize(int intSize) {
		this.intSize = intSize;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setOrigin(Point origin) {
		this.origin = origin;
	}
	
	public List<Point> getGridPoints()
	{
		List<Point> points = new ArrayList<Point>();
		int originX= (int) getOrigin().getX();
		int originY= (int) getOrigin().getY();
		int intSize = getIntSize();		
		int minX =   originX - ((int) Math.floor(getNumPointsX()/2)*intSize);
		int maxX =   originX + ((int) Math.ceil (getNumPointsX()/2)*intSize);
		int minY =   originY - ((int) Math.floor(getNumPointsY()/2)*intSize);
		int maxY =   originY + ((int) Math.ceil(getNumPointsY()/2)*intSize);
		
		for (int i = minX; i <= maxX; ++i)
		{
			for (int j = minY; j <= maxY; ++j)
			{
				points.add(GeometryFactory.createPoint(i, j));
			}
		}
		return points;		
	}
}
